package com.yang.designmode.singleton;

/**
 * 双重检查锁定（Double-Check Locking）实现的单例模式。
 * 保证了多线程环境下的单例实例创建，并且只进行一次同步操作，提高性能。
 */
public class DoubleCheckSingleton {

    /**
     * 使用 volatile 关键字确保多线程环境下的可见性和禁止指令重排序。
     * 保证在所有线程中该变量的值是一致的。
     */
    private static volatile DoubleCheckSingleton instance;

    /**
     * 私有构造函数，防止外部通过 new 创建实例。
     */
    private DoubleCheckSingleton(){}

    /**
     * 获取单例对象的方法。
     * 使用双重检查锁定机制来延迟初始化单例对象。
     *
     * @return 单例对象
     */
    public static DoubleCheckSingleton getInstance(){
        // 第一次检查：如果 instance 已经被初始化，则直接返回，避免不必要的同步开销
        if(instance == null){
            // 同步类锁，保证只有一个线程进入代码块
            synchronized (DoubleCheckSingleton.class){
                // 第二次检查：确保只有一个实例被创建
                if(instance == null){
                    // 创建单例对象
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
}
